home *** CD-ROM | disk | FTP | other *** search
Text File | 1996-11-17 | 62.6 KB | 1,193 lines |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Dokumentation zum Programm: FEDIT
-
- Stand: 26.07.1989
-
- PUBLIC DOMAIN
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Inhalt (Numerierung bezogen auf 56 Zeilen/Seite)
-
- 1 Copyright . . . . . . . . . . . . . . . . . . . . . . . 3
- 2 Was FEDIT ist (und was nicht) . . . . . . . . . . . . . 3
- 3 Konventionen und allgemeine Eigenschaften . . . . . . . 5
- 4 FEDIT als File Editor . . . . . . . . . . . . . . . . . 5
- 4.1 Kommandozeilenformat . . . . . . . . . . . . . . . . 5
- 4.2 Das Konzept der 'Filepuffer' . . . . . . . . . . . . 6
- 4.3 Fileanzeige und Eingabemöglichkeiten . . . . . . . . 7
- 4.4 Marker und Offset- Funktionen . . . . . . . . . . . 8
- 4.5 Blockmarkierung und Blocktransfer . . . . . . . . . 9
- 4.6 Suchen und Ersetzen; Verknüpfungsmodi . . . . . . . 10
- 4.7 Ungleichheit suchen . . . . . . . . . . . . . . . . 12
- 4.8 Pfad setzen und Directory . . . . . . . . . . . . . 12
- 5 Der Memory- Modus . . . . . . . . . . . . . . . . . . . 13
- 5.1 Unterschiede zum File- Modus . . . . . . . . . . . . 13
- 5.2 Die GEMDOS- Funktionen . . . . . . . . . . . . . . . 14
- 6 Der Image- Modus (Speicher zeigen als Bild) . . . . . . 15
- 7 FEDIT resident; Aufruf und Einschränkungen . . . . . . . 16
- 7.1 Allgemeines . . . . . . . . . . . . . . . . . . . . 16
- 7.2 RESET- Residenz . . . . . . . . . . . . . . . . . . 16
- 7.3 'Unbedingter' Aufruf . . . . . . . . . . . . . . . . 17
- 7.4 Bedingter Aufruf . . . . . . . . . . . . . . . . . . 17
- 7.5 Beschränkungen des Aufrufs . . . . . . . . . . . . . 18
- 7.6 Anpassung an weitere TOS- Versionen . . . . . . . . 18
- 8 FEDIT- 'Systemvariablen' . . . . . . . . . . . . . . . . 19
- 8.1 Inhalt des entsprechenden Bereichs von FEDIT . . . . 19
- 8.2 Und Erläuterungen dazu . . . . . . . . . . . . . . . 20
- 9 Beispiele für den Umgang mit FEDIT . . . . . . . . . . . 22
- 10 Abschied . . . . . . . . . . . . . . . . . . . . . . . . 23
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 1 Copyright
-
- Das Programm FEDIT.PRG und diese Dokumentation wurden erstellt von
-
- Bernd Feige
- Regerstraβe 20 | Probsteistraβe 8
- 5750 Menden 2 | 4400 Münster
- Konto Nr. 7531072 BLZ 447.500.65
-
- Programm und Dokumentation dürfen und sollen frei kopiert und weitergegeben
- werden, unter der Voraussetzung, daβ die Files zusammenbleiben und die
- Urhebervermerke in beiden nicht gelöscht oder verändert werden.
-
- Der Autor übernimmt keine Haftung für Schäden, die durch die Verwendung
- dieses Programmes entstehen; Ebensowenig haftet er für die Verwendbarkeit
- des Programmes für irgendeinen bestimmten Zweck.
-
- Wie bei PUBLIC DOMAIN- Programmen üblich, wird die Entrichtung eines
- angemessen erscheinenden Obulus an den Autor dem Programmbenutzer
- freigestellt.
-
-
- 2 Was FEDIT ist (und was nicht)
-
- Nach den üblichen Formalitäten nun ein paar Bemerkungen zu FEDIT:
-
- Der Name FEDIT steht eigentlich für File EDITor. Das Programm wurde
- ursprünglich geschrieben, um beliebige Files ansehen und bearbeiten zu
- können. Weil es so nahe lag, ist auβerdem ein Memory Editor daraus
- geworden. Oft sind Daten- und Filestrukturen von Programmen nicht
- dokumentiert, was der Schaffung vermittelnder Programme nicht gerade
- förderlich ist. Die hohe Versionsnummer von FEDIT (6.2) dokumentiert, daβ
- ich dem Editor jeweils die Eigenschaften hinzugefügt habe, die zur Analyse
- nützlich waren. Jedenfalls war die Erstellung von FEDIT nicht Selbstzweck.
- Die vorliegende Version von FEDIT selbst wurde mithilfe von FEDIT aus zwei
- getrennt übersetzten Assemblerprogrammen zusammengesetzt (Tatsächlich: Das
- Hauptprogramm wurde in einen reservierten Bereich des Laderprogrammes
- eingesetzt).
-
- - Visuelle Ganzschirm- Bearbeitung von Files und Speicher
- - Anzahl gleichzeitig im Speicher gehaltener Files und Puffer beliebig
- - 7 Marker über einfachen Tastendruck zu erreichen
- - Block- Markierung und Transfer auch zwischen Files sowie zwischen Files
- und Speicher RAM/ROM
- - Schnelles Suchen und Ersetzen (auch unter Änderung der Filelänge)
- - Vergleich von Code- Passagen
- - Anzeige und Eingabe von Byte-, Word- und Long- Inhalten der aktuellen
- Position in Dezimal oder Hex
- - Offset- Funktionen
-
- - Verschiedene GEMDOS- Befehle aus dem MEMORY- Menu zugänglich: Aufruf/nur
- Laden/nur Starten anderer Programme, Directory, Freigabe von
- Speicherblöcken, Speicherblockgröβe verändern
-
- - Residentes Installieren:
- - FEDIT wird aufgerufen nach einem Reset oder Systemabsturz, bevor der
- Speicher gelöscht wird; Man kann sich seine Daten wieder rekonstruieren
- (Hierzu Dank an Martin Wielebinski für seinen informativen Artikel in der
- C't 6/89)
- - FEDIT merkt, wenn es im Rahmen des Bootens (Autoordner) gestartet wurde,
- und installiert sich dann automatisch resident
- - Das bekannte Problem resetresidenter (Autoordner-) Programme mit dem
- Löschen des Speichers bis $ffff vor deren Aufruf wird umgangen, indem FEDIT
- seinen Bildschirmspeicher VOR dem eigenen Programmtext positioniert (damit
- ist der Programmtext von FEDIT auf jeden Fall aus der Gefahrenzone heraus)
- - FEDIT ist in (fast) jeder Situation über die Shifttasten aufrufbar; Man
- kann sich die Programme im Speicher, deren Stack und Daten ansehen, Teile
- davon abspeichern oder verändern und (mit Vorbehalt) andere Programme
- aufrufen, das unterbrochene Programm dann seine Arbeit fortsetzen lassen.
- - Die Unterbrechung von Programmen kann per Option auch selektiv erfolgen,
- d.h. FEDIT wird nur gestartet, wenn sich die Abarbeitung beim Interrrupt in
- einem bestimmten Speicherbereich befand (Line A- Routine markieren und
- schauen, ob ein bestimmtes Programm diese Routine (regelmäβig) benutzt...)
- - Die nichtdokumentierten und TOS- versionsabhängigen Systemvariablen, die
- von dem Interrupt- Teil von FEDIT verwendet werden, holt FEDIT sich
- entsprechend dem TOS- Datum aus einer Tabelle, in der noch freie Einträge
- sind; Für ROMTOS vom 6.02.1986, Blitter- ROMTOS vom 22.04.1987 und RAMTOS
- vom 18.05.1988 sind die notwendigen Adressen bereits eingetragen
-
- - FEDIT arbeitet auch mit Farbmonitor; Palette und Auflösung werden für die
- Laufzeit des Programms auf eigene Werte umgestellt, um immer die gewohnte
- Umgebung zu bieten
-
- - Anzeigen von Files oder Speicher als Bild einstellbarer Breite in
- verschiedenen Auflösungen mit der Palette, mit der FEDIT aufgerufen wurde;
- Zum Lokalisieren von Bildern, Bildausschnitten und Icons im Speicher oder
- zum schnellen Überblick über die Speicherbelegung durch halbseitenweises
- Scrolling
-
- - Die wichtigsten und informativsten 'Systemvariablen' von FEDIT sind am
- Ende des Programmtextes angeordnet und mit Kurzwörtern markiert, die (mit
- FEDIT) leicht aufzufinden sind
-
- - FEDIT ist KEIN Texteditor (man munkelt, dafür gäbe es komfortablere
- Programme; obwohl man mit FEDIT natürlich auch Texte erstellen könnte, und
- schlieβlich könnte man damit auch lauffähige Maschinenprogramme schreiben,
- wenn man mit den Bits auf gutem Fuβe steht)
-
- - FEDIT ist kein GEM- Programm. (Falls es das wäre, wäre es nicht so leicht
- möglich, GEM- Programme folgenlos zu unterbrechen.) Je nach Geschmack ist
- das sicherlich für die ein Manko, die schon verlernt haben, wie man
- Tasstatur überhaupt schreibt
-
- - FEDIT ist nicht kindersicher. Wenn man den Hauptspeicher (am besten die
- 'zero page') als Block markiert und per Tastendruck diesen Block löschen
- läβt, muβ man schon wissen, was man tut...
-
- - Im Interesse der Vermeidung gewaltiger Systemabstürze werden beim
- Aktivieren über Shifttasten keine GEMDOS- Funktionen bei ihrer wichtigen
- Arbeit unterbrochen. (FEDIT selbst verwendet GEMDOS- Funktionen; Im
- Gegensatz zum BIOS, dessen Savebereich noch recht einfach zu sichern ist,
- ist GEMDOS durch die Vielzahl fester Speicherstellen und Puffer, die es
- benutzt, hochgradig nicht- reentrant) Man kommt also gerade aus besonders
- einfachen Programmen (FEDIT selbst ist so eines), die die meiste Zeit ihres
- Lebens mit GEMDOS- Zeicheneingabe- Funktionen verbringen, nicht ohne
- weiteres in das residente FEDIT.
- - Die selbstverständliche zweite Einschränkung ist, daβ FEDIT Anfragen auf
- Aufruf zurückweist, solange gerade ein Floppyzugriff stattfindet (flock).
-
-
- 3 Konventionen und allgemeine Eigenschaften
-
- - Zahlen und Filenamen werden in FEDIT mithilfe einer einfachen
- Zeileneingabefunktion eingegeben. Darin kann man mit Backspace das jeweils
- zuletzt eingegebene Zeichen löschen, mit Escape löscht man die ganze
- Eingabezeile. Weitere Editiermöglichkeiten stehen nicht zur Verfügung.
- - Allgemein steht eine Leereingabe dabei für 'Operation nicht durchführen'.
- - Zahlen können in dezimal oder, durch Voranstellen eines '$'- Zeichens, in
- Hexadezimal eingegeben werden. Negative Zahlen durch setzen eines '-'-
- Zeichens vor die ganze (Hex oder Dezimal-) Zahl.
- - Alle Markierungen von Positionen sind Speicher- absolut. Das heiβt, daβ
- man zum Beispiel in einem Filepuffer Blockmarkierungen oder Marker setzen
- kann und im Memory- Modus dann an die Stelle im Speicher gelangt, an der
- der Filepuffer steht, wenn man auf diese Markierung positioniert. Weder
- Marker noch Block- Markierungen beschränken sich also auf einen bestimmten
- Puffer (Wenn man will, kann man auch in einem File Blockanfang und in einem
- anderen Blockende markieren, und hat damit den ganzen Speicher zwischen den
- beiden Filepuffern mitmarkiert).
- - Filenamen müssen immer vollständig gegeben werden (Zum Beispiel beim
- Aufruf von Programmen: Endung nicht vergessen !)
- - Beim Abspeichern auf Diskette erscheint, wenn das angegebene File bereits
- existiert, eine Sicherheitsabfrage, die es ermöglicht, das bestehende File
- zu überschreiben, das zu schreibende an das bestehende anzuhängen oder das
- Abspeichern abzubrechen.
-
-
- 4 FEDIT als File Editor
-
- 4.1 Kommandozeilenformat
-
- Wenn FEDIT aus einer Shell aufgerufen oder als 'Tos Takes Parameter'
- angemeldet wird, kann der Name eines zu ladenden Files als
- Kommandozeilenparameter angegeben werden.
- Der Aufruf aus einer Shell hat die Form
-
- FEDIT filename zusatzlänge
- oder FEDIT +pufferlänge
-
- wobei filename der vollständige Pfad und Filename des zu ladenden Files ist
- und zusatzlänge die Anzahl von Bytes, um die der Speicher (Puffer), in den
- das File geladen wird, länger sein soll als das File. Dabei ist zu
- beachten, daβ die Filelänge nur im Rahmen der Länge des Puffers geändert
- werden kann.
- Wird nur ein '+'- Zeichen, gefolgt von einer Zahl, angegeben, so erhält man
- einen leeren Puffer, dessen Filelänge zunächst gleich der Pufferlänge ist.
-
- Wenn man FEDIT ohne Argumente aufruft, so wird man nach einer Eingabezeile
- gefragt (wenn man die Zusatzlänge nicht in einer Zeile mit angibt, wird
- danach getrennt gefragt).
- Der Eingangsschirm, der auf diese Weise die Form des ersten anzulegenden
- Filepuffers erfragt, sieht etwas mager aus. Das liegt daran, daβ FEDIT
- seine Puffer als verkettete Struktur organisiert und das Hauptmenu erst
- dann anbieten kann, wenn mindestens ein Puffer vorhanden ist.
-
- Will man FEDIT also 'nur' als Memory- Editor verwenden, so wird man FEDIT
- zum Beispiel mit '+100' als Eingabezeile versehen. (Daβ man als Länge
- selten '1' wählen wird, liegt daran, daβ man einen leeren Puffer gut für
- die Eingabe von Find- und Replace- Strings gebrauchen kann)
-
-
- 4.2 Das Konzept der 'Filepuffer'
-
- Filepuffer sind schlicht mit den Betriebssystemfunktionen reservierte,
- zusammenhängende Regionen im Speicher des Rechners. Das Programm FEDIT
- selbst gibt direkt nach dem Programmstart allen Speicherplatz, den es nicht
- selbst benötigt, wieder an das Betriebssystem zurück. (Im Memory- Menu gibt
- es eine Funktion, die die Länge des gröβten zusammenhängenden
- Speicherblocks anzeigt, der noch verfügbar ist.)
- Mit den Funktionen 'Leeren Filepuffer schaffen', 'Filepuffer freigeben' und
- 'Nächstes File laden' kann man diese Puffer behandeln. Ein Filepuffer hat
- eine absolute Länge ('End of Buffer') und eine Filelänge ('End of File'),
- die höchstens so groβ sein kann wie die Pufferlänge. Ferner gehört zu jedem
- Puffer eine eigene aktuelle Cursorposition innerhalb des Files und ein
- Veränderungsstatus, der angibt, ob der Benutzer bereits einer Änderung des
- Inhalts und/oder der Länge des Files zugestimmt hat. (Bei leeren Puffern
- oder im Memory- Modus wird diese Zustimmung als bereits gegeben
- angenommen.)
- Mit 'EOF verschieben auf...' (EOF steht für End Of File) kann man die Länge
- des Files auf bestimmte Werte innerhalb des Filepuffers einstellen. Es
- handelt sich dabei nur um eine 'weiche Markierung', der Inhalt des Puffers
- hinter dieser Marke ist nur unzugänglich, aber nicht gelöscht. Wenn man mit
- 'File abspeichern' das File auf Diskette schreibt, wird nur der Puffer bis
- zur 'End of File'- Position geschrieben.
-
- Die (theoretisch beliebig vielen) Puffer bilden eine verkettete Liste, in
- der man sich mit 'Nächsten Filepuffer' und 'Vorigen Filepuffer' fortbewegen
- kann. Neue Puffer werden am Ende der bisherigen Kette angehängt. (Die Kette
- bildet nur eine logische Verknüpfung der einzelnen Puffer; In welcher
- Reihenfolge und wo überhaupt sie im Speicher stehen, ist Sache des GEMDOS.
- Wenn man etwa drei Puffer hat und den mittleren freigibt, um dann wieder
- einen Puffer gleicher Gröβe zu schaffen, wird dieser Puffer in der Regel an
- derselben Speicherposition stehen wie der gelöschte; Aber in der Kette
- hängt er nun hintenan)
- FEDIT merkt sich nicht die Namen der Files, die in die jeweiligen Puffer
- geladen wurden. Man muβ den Filenamen beim Abspeichern nochmals eintippen.
- Dafür hat man so gröβere Sicherheit, daβ man nicht ungewollt eine wertvolle
- Sourcedatei überschreibt.
-
-
- 4.3 Fileanzeige und Eingabemöglichkeiten
-
- Zum Programmbeginn und wenn man im Menu die Eingabetaste betätigt, befindet
- man sich im Editiermodus des aktuellen Files.
- Dabei wird das aktuelle File durchgängig mit 80 Zeichen pro Zeile
- angezeigt. Eine Zeile fängt immer an einer durch 80 teilbaren Fileposition
- an. FEDIT versucht, die Zeile, in der der Cursor steht, auf dem Bildschirm
- zu zentrieren, wenn der Schirm neu aufgebaut wird. Der Cursor kann mithilfe
- der Cursortasten oder mit der Maus bewegt werden. (Im Menu kann man auch
- eine gewünschte Position als Zahl angeben. Die Position stimmt mit den
- gängigen Filepositionsangaben überein, wie sie etwa von SEEK verlangt
- werden.) Betätigen der Tastatur führt in der Regel dazu, daβ die
- entsprechenden Zeichen unter Weiterrücken des Cursors in das File
- geschrieben werden. ('File' steht hier für das 'File' im Speicher, so es
- denn so etwas gibt, nicht für ein File auf Diskette.) Es kann sein, daβ man
- erst die Bestätigung zur Veränderung des Files geben muβ, bevor der
- Tastendruck tatsächlich geschrieben wird. Dazu achte man auf den unteren
- Rand des Schirms !
- Die unterste Zeile des Bildschirms enthält eine Infozeile, in der die
- aktuelle Cursorposition sowie der Inhalt des Bytes unter dem Cursor im
- gewählten Zahlensystem angezeigt werden.
-
- - Mit der HELP- Taste erhält man eine kurzgefaβte Beschreibung der Tasten,
- denen bestimmte Funktionen zufallen.
- - Mit der Escape- Taste gelangt man zum Menu.
- - Halbseitenweise vor/zurück kommt man mit <shift>Cursor down/up
- - Den Byteinhalt der aktuellen Position kann man mit <shift>Cursor
- left/right herunter/heraufzählen
- - Das Zeichen an der aktuellen Position unter Aufschieben des Rests löschen
- (Änderung der Filelänge) mit Delete (Die Taste Backspace hat keine
- Funktion)
- - Einfügen eines Null- Zeichens unter Wegrücken des Rests (Änderung der
- Filelänge) mit Insert
- - Cursor auf Fileanfang/Ende setzen mit Home/<sweet>Home (wer keine
- <sweet>- Taste an seinem Rechner hat, verwende einfach die Shifttaste)
- - Anzeigen des Positionsinhalts (das ist der Inhalt der entsprechenden
- Anzahl von Speicherstellen ab der aktuellen Position) Byte/Word/Long (1
- Byte, 2 Bytes oder 4 Bytes entsprechend der üblichen Zahlendarstellung des
- Prozessors zusammengefaβt) mit den Funktionstasten F1/F2/F3
- - Anzeigen des Positionsinhalts Byte/Word/Long als negative Zahl mit
- <alt>F1/F2/F3 (FEDIT stellt eine Zahl wie $ffff.w nicht automatisch als -1
- dar)
- - Umschalten der Zahlendarstellung zwischen Dezimal und Hexadezimal mit
- <ctrl>UNDO
- - Eingeben des Positionsinhalts Byte/Word/Long mit <shift>F1/F2/F3
-
-
- 4.4 Marker und Offset- Funktionen
-
- Die Funktionstasten F4 bis F10 sind den sieben Positionsmerkern von FEDIT
- zugeordnet.
- Mit <shift>F4-F10 wird die aktuelle Position im Speicher in dem
- entsprechenden Merker abgelegt; Mit F4-F10 wird versucht, den Cursor auf
- die Speicherposition zu setzen, die von dem jeweiligen Merker angegeben
- wird. Das ist kein Problem, wenn die gespeicherte Position im Bereich des
- aktuellen Filepuffers liegt; Ansonsten kommt man an das Ende des Files,
- welches der gespeicherten Position am nächsten liegt. (In allen Merkern
- steht bei Programmbeginn der Wert 0, der der absoluten Speicheradresse 0
- entspricht.) Natürlich kommt man, wenn man einen Merker im selben File
- abfragt, in dem man ihn gesetzt hat, wieder an dieselbe Fileposition
- zurück, an der man ihn gesetzt hat; Für das Verständnis der Offset-
- Funktionen sollte man aber schon wissen, daβ eigentlich nicht die
- Fileposition gespeichert wird, sondern die Position im ganzen Speicher
- (nämlich die Speicheradresse). Wenn man also einen Marker in einem anderen
- File abfragt als setzt, so kommt man nicht auf die gleiche Fileposition des
- jetzigen Files.
-
- Nun zu den ominösen Offset- Funktionen:
- In vielen Nicht- Text- Dateien kommen Adressen im weitesten Sinne vor. Das
- sind Zahlen in Maschinenform (also Byte-, Word- oder Longwerte), die auf
- bestimmte Positionen in der Datei (oder im Speicher) zeigen. Im Prinzip ist
- jede Adresse relativ, da sie die Anzahl Speicherstellen angibt, um die man
- von einer bestimmten Position aus weitergehen muβ, um die gewünschte
- Position zu erreichen. Bei den sogenannten 'absoluten' Adressen ist die
- Ursprungsposition der Anfang des vorhandenen Speichers.
- Ein Beispiel für eine im engeren Sinne relative Adresse ist etwa die
- Textsegmentlänge eines Programmes, die in dessen 28 Bytes langen Header
- ('Vorspann') ab Position 2 steht (ein Langwort). Da das Textsegment bei
- Position 28 beginnt und das Datensegment sich direkt anschlieβt, gibt die
- Textsegmentlänge praktisch die Adresse des Datensegments an relativ zur
- Position 28. Was würde man nun tun, um an den Anfang des Datensegments zu
- gelangen ? Man könnte sich mit dem Cursor auf Position 2 begeben und (mit
- F3) den Langwort- Inhalt, also die Textsegmentlänge, anzeigen lassen. Dann
- würde man 28 addieren und über das Menu den Cursor auf die errechnete
- Stelle setzen.
- Da ähnliche Probleme (bei mir) häufiger auftreten, bietet FEDIT eine
- einfachere Möglichkeit: Man gehe nach Position 28 und speichere diese
- Position in einen Merker; Danach gehe man auf die Position 2, die ja die
- Angabe darüber enthält, wie viele Zeichen man von Position 28 weiterrücken
- muβ, um die gewünschte Position zu erreichen, und drücke <alt> zusammen mit
- der Taste des Merkers, auf den man die Position 28 gelegt hat. FEDIT liest
- den Inhalt der aktuellen Position, addiert den Merker und setzt den Cursor
- an die resultierende Stelle, in unserem Falle also direkt auf das erste
- Byte des Datensegments. Wenn man nun diese Position in einen Merker
- speichert und auf die Fileposition 6 geht, die die Länge des Datensegments
- enthält, sodann <alt> zusammen mit dem Merker drückt, in den man den Anfang
- des Datensegments gespeichert hat, gelangt man auf das erste Byte des
- sogenannten Relocation Tables. Auch die sollte man in einen Merker
- übernehmen, aber nur, damit man schneller zurückkommt. Das erste Langwort
- des Relocation Tables enthält die Position der ersten Speicherstelle des
- Programmes, die beim Laden desselben reloziert werden muβ; Relozieren heiβt
- hier das Ersetzen von Adressen, die relativ zum Programmbeginn, also
- relativ zu unserem Marker 28, angegeben sind, durch die Adressen relativ
- zum Speicherbeginn, also die absoluten Adressen. Auch diese Position der
- ersten zu relozierenden Programmstelle ist relativ zum Marker 28 gemeint.
- Man kann also diese Speicherstelle mit <alt>Marker 28 anspringen. (Wenn man
- nun gleich wieder <alt>Marker 28 drücken wurde, gelänge man zu der
- Position, die das Programm an dieser Stelle ansprechen will. Das kann zum
- Beispiel der Anfang einer auszugebenden Meldung sein) Auch diese Position
- sollte man sich merken, denn die nächsten zu relozierenden Stellen
- erreichen wir, indem wir von dieser Position aus weiterrücken. Man gehe an
- die Relokationstabelle zurück und 4 Bytes weiter. Bislang sind wir davon
- ausgegangen, daβ FEDIT die aktuelle Speicherstelle mit dem Offset als
- Langwort liest. Mit <shift>Help kann man dieses Verhalten ändern. Wir
- schalten auf 'Byte pos. Modus', was heiβen soll, daβ Offsets nun als Bytes
- statt als Langworte behandelt werden. Die nunmehr aktuelle Position stellt
- einen solchen Offset in Bytegröβe dar, und zwar den Abstand von der letzten
- Relokationsposition zur nächsten. Man gelangt also durch Drücken von <alt>
- zusammen mit dem Merker der letzten Relokationsposition zur nächsten.
- (nebenbei: Der Byteinhalt 1 steht für '254 Bytes weiterrücken und nicht
- relozieren', eine Null kennzeichnet das Ende der Tabelle.)
-
- Es gibt auch eine Funktion, die einem das Ausrechnen und Eintragen von
- Offsets erspart, die man selbst schreiben möchte: Mit <ctrl>F5-F10 wird die
- Differenz zwischen dem Merker der gedrückten Funktionstaste und dem der
- vorigen in der eingestellten Länge (Byte, Word oder Long) in die aktuelle
- Position geschrieben. Wenn man also zum Beispiel die Textsegmentlänge eines
- Programmes eintragen wollte, würde man etwa die Position 28 auf F4
- speichern und den Anfang des Datensegments auf F5. Dann würde man Position
- 2 aufsuchen und dort <ctrl>F5 drücken, nachdem man sich überzeugt hat, daβ
- der 'Pos. Modus' auf 'Long' gestellt ist, damit die Differenz als Langwort
- an die aktuelle Position geschrieben wird. Auf die gleiche Weise kann man
- auch angesprochene Adressen in einem Programm ändern.
-
-
- 4.5 Blockmarkierung und Blocktransfer
-
- Um Abschnitte innerhalb von Files oder im Speicher zu markieren, kann man
- mit UNDO und <shift>UNDO oder mit der linken und rechten Maustaste Anfang
- und Ende des markierten Blocks angeben. Die Markierung erfolgt inklusive,
- das heiβt die Zeichen, auf denen man stand, als man Blockanfang und
- Blockende markierte, gehören beide mit zum Block.
- Mit <ctrl>Cursor up/down wird die aktuelle Position auf die Blockanfang/
- Blockendemarke gesetzt.
- Im Menu kann man zunächst drei Dinge auswählen, die mit dem markierten
- Block geschehen sollen: Man kann den Blockinhalt an die aktuelle Position
- im aktuellen File kopieren lassen (wobei völlig egal ist, ob der markierte
- Block sich im aktuellen File selbst, in einem anderen File oder irgendwo im
- Speicher befindet), man kann den Inhalt des markierten Blocks als Datei
- abspeichern oder den Inhalt des markierten Blocks löschen ('Zero Block',
- das heiβt, daβ der Blockbereich mit Nullen aufgefüllt wird).
- Beispielsweise ist es, wenn man längere Abschnitte aus einem Text
- herausnehmen will, sehr mühsam, das mit der Delete- Taste zu tun;
- Stattdessen wird man die Stelle, an der der zu erhaltende Text weitergeht,
- als Blockanfang und das Fileende als Blockende markieren, diesen Block
- dorthin kopieren, wo das herauszunehmende Stück beginnt und dann im Menu
- die Filelänge auf den neuen Wert ändern.
-
-
- 4.6 Suchen und Ersetzen; Verknüpfungsmodi
-
- FEDIT verfügt über eine Funktion, mit der man im Filepuffer oder im
- Speicher nach dem Vorkommen einer beliebigen Folge von Zeichen suchen
- lassen kann. Um für die Eingabe solcher Zeichenfolgen die gesamten
- bestehenden Editierfunktionen zur Verfügung zu haben, wird einfach der
- aktuelle Blockinhalt als zu suchende Zeichenkette aufgefaβt. Wenn man also
- in einem File nach der Zeichenfolge 'FEDIT' suchen lassen will, wird man
- sich einen Filepuffer schaffen (oder einen bestehenden Puffer verwenden,
- auf dessen Inhalt es nicht ankommt) und die Zeichenfolge 'FEDIT' irgendwo
- in diesen Filepuffer schreiben; Dann markiert man das 'F' als Blockanfang
- und das 'T' als Blockende, geht in den Puffer zurück, in dem man suchen
- lassen will (oder in den Memory- Modus), positioniert den Cursor auf die
- Stelle, an der die Suche beginnen soll, und wählt 'Blockinhalt suchen' im
- Menu an. Wird der Suchtext irgendwo zwischen der Position, die der
- aktuellen Position folgt, und dem aktuellen Fileende gefunden, so wird der
- Cursor auf diese Stelle positioniert. Um das nächste Vorkommen zu suchen,
- braucht man also nur wieder 'Blockinhalt suchen' anzuwählen.
- Die Suche (gilt nicht für 'Suchen und Ersetzen') wird bei Druck einer
- beliebigen Taste abgebrochen (Bei allen Tasten jedenfalls, die einen
- Eintrag im Tastaturpuffer hinterlassen). Das ist besonders interessant im
- Memory- Modus; Files sind selten so groβ, daβ man lange auf die Meldung
- 'Nicht gefunden' warten müβte. (Wen's interessiert: Um die sehr kompakte
- Suchschleife nicht mit der Tastaturabfrage zu belasten, wird zur
- Unterbrechung der Tastaturinterrupt umgeleitet)
-
- Im Filemodus gibt es auch die Möglichkeit, sämtliche Zeichenketten, die
- zwischen der aktuellen Position und dem aktuellen Fileende mit dem Inhalt
- des markierten Blocks übereinstimmen, durch eine andere Zeichenkette zu
- ersetzen, die auch eine andere Länge haben kann. Diese Zeichenfolge, die
- die im Block markierte Zeichenfolge ersetzen soll, wird durch den
- 'Replaceblock' markiert. Der Replaceblock beginnt direkt hinter dem
- markierten Block, das Ende kann man mit <alt>UNDO markieren.
- Beispiel: Man hat ein Textfile, in dem man alle 'ae' durch 'ä' ersetzen
- lassen will. In einen freien Puffer schreibe man 'aeä', markiere das 'a'
- als Blockanfang, das 'e' als Blockende (das heiβt, nach 'ae' soll gesucht
- werden) und das 'ä' als Replaceblockende (das heiβt, für jeden gefundenen
- Ausdruck wird bei 'Suchen und ersetzen' ein 'ä' eingesetzt). Dann gehe man
- zu dem Filepuffer, in dem die Ersetzung durchgeführt werden soll, und wähle
- 'Suchen und ersetzen' aus dem Menu.
- Für die umgekehrte Ersetzung, also alle 'ä' gegen 'ae', müβte man
- entsprechend 'äae' schreiben, das 'ä' sowohl als Blockanfang wie als
- Blockende sowie das 'e' als Replaceblockende markieren.
- Wollte man alle 'P' aus einem File herauslöschen, müβte man ein 'P' als
- Blockanfang, Blockende UND als Replaceblockende markieren.
- Natürlich braucht weder die gesuchte noch die ersetzte Zeichenfolge aus
- Textzeichen zu bestehen. Der Inhalt ist völlig beliebig.
- Wenn man Zeichenketten durch Zeichenketten anderer Länge ersetzt, ändert
- sich naturgemäβ die Länge des Files; Ist die eingesetzte Zeichenkette
- länger als die ersetzte, muβ der Filepuffer mindestens so groβ sein, daβ er
- das vergröβerte File fassen kann. (Sonst gibt es eine Fehlermeldung, und
- KEINE der Ersetzungen wird durchgeführt.)
-
- Die Funktionen des Suchens und Ersetzens können tatsächlich in ihrer
- Wirkungsweise noch modifiziert werden.
- Die Suche nach einer Zeichenkette funktioniert so, daβ zunächst der Inhalt
- der aktuellen Suchposition im File mit dem ersten Byte des Suchausdrucks
- (hier also des Blockinhalts) verglichen wird; Wenn der Vergleich hier
- erfolgreich ist, werden die nächsten beiden Bytes verglichen usw.; Waren
- alle Vergleiche bis zum Ende des Suchausdrucks erfolgreich, ist die
- Zeichenkette gefunden.
- In FEDIT erfolgt der Vergleich zweier Bytes mithilfe logischer Funktionen;
- Der Vergleich ist erfolgreich, wenn die logische Verknüpfung der Bytes 0
- ergibt.
- Die Voreinstellung für das normale Suchen ist die Verwendung der
- Verknüpfung 'EOR', Exklusiv- Oder.
- Das Ersetzen kann man ebenfalls über logische Verknüpfung der
- Zielzeichenkette mit der Replace- Zeichenkette erreichen. Voreingestellt
- ist die strikte Ersetzung.
-
- Mit 'Verknüpfung setzen' aus dem Menu kann man auswählen, welche
- Verknüpfungen dem Suchen und Ersetzen (respektive) zugrundeliegen sollen.
- Bei dieser Auswahl kann man mit den Cursortasten die gewünschte Verknüpfung
- invers dastellen lassen, mit <Return> die Auswahl beenden.
-
- Die möglichen Verknüpfungen für das Suchen sind:
- EOR, AND, NEOR, NAND, less, greater
- Und die möglichen Verknüpfungen für das Ersetzen:
- Replace, AND, OR, EOR, NOT Dest.
-
- Dabei bedeuten EOR logisches Exklusiv- Oder, OR logisches Oder, AND
- logisches Und; NEOR und NAND sind nicht etwa die bitweise inversen
- Funktionen, sondern EOR und AND, wobei aber der Vergleich erfolgreich ist,
- wenn die Verknüpfung für alle Zeichen NICHT Null ergibt.
- less und greater sind dann erfolgreich, wenn alle Bytes der
- Zielzeichenkette kleiner bzw. gröβer sind als die entsprechenden Bytes im
- Suchausdruck.
- Replace heiβt strikte Ersetzung der Zielzeichenkette; NOT Dest. (NOT
- Destination, Zielzeichenkette logisch negieren) verneint so viele Bytes der
- Zielzeichenkette, wie im Replaceblock enthalten sind; Der konkrete Inhalt
- des Replaceblocks wird dabei nicht verwendet.
-
- In aller Regel wird man die Nicht- Standard- Verknüpfungen nur auf einzelne
- Zeichen anwenden; Die Möglichkeit, ganze Zeichenketten zu behandeln, sowie
- die Möglichkeit, die ersetzte Länge von der Suchlänge unabhängig zu
- bestimmen, sind eigentlich nur Abfallprodukte der Standardfunktion. Man
- meine also nicht, diesen Möglichkeiten müβten häufige Anwendungen
- entsprechen.
-
- Als ein kleines Beispiel für die Anwendung der Verknüpfungsmodi mag das
- Problem dienen, bei allen Bytes mit gesetztem Bit 7 dieses Bit zu löschen.
- Dazu gibt es mehrere Möglichkeiten; Zum Beispiel schreibe man in einen
- freien Puffer in zwei aufeinanderfolgende Bytes jeweils den Wert 128 ($80),
- der einem gesetzten 7. Bit entspricht; Das erste Byte markiere man als
- Blockanfang und Blockende, das zweite als Replaceblockende. Dann setze man,
- wenn noch nicht geschehen, den Verknüpfungsmodus auf NAND und EOR, gehe zu
- dem gewünschten Filepuffer und lasse 'Suchen und Ersetzen'. Es werden nun
- alle Bytes gesucht, bei denen Byte AND $80 NICHT 0 ergibt, bei denen also
- Bit 7 gesetzt ist, und durch Byte EOR $80 ersetzt, was ein Umklappen des
- Bit 7 zur Folge hat. Natürlich könnte man ebensogut als Replace- Byte den
- Wert 127 ($7f) nehmen, bei dem alle Bits bis auf Bit 7 gesetzt sind, und
- als Replace- Modus AND nehmen. Und schlieβlich braucht man bei Verwendung
- letzterer Verknüpfung zum Ersetzen auch beim Suchen nicht so wählerisch zu
- sein, man könnte das Suchbyte zu 0 setzen und als Find- Verknüpfung NEOR
- wählen, wobei dann Byte AND $7f mit jedem Byte durchgeführt wird, das nicht
- gleich 0 ist.
-
- Vielleicht sollte erwähnt werden, daβ die Funktionen zum Suchen und
- Ersetzen extrem schnell ablaufen; Die Suchgeschwindigkeit beträgt ca. 80kB
- pro Sekunde. Das Ersetzen unter Ausdehnung des Files dauert etwa doppelt so
- lange wie das Ersetzen unter Verkleinerung oder Beibehaltung der Gröβe, da
- hierbei das File zweimal durchsucht wird (Einmal davon, um die Anzahl der
- Ersetzungen festzustellen, und einmal beginnend von hinten zum Ersetzen).
-
-
- 4.7 Ungleichheit suchen
-
- Wenn man herausfinden möchte, ob Passagen in Files identisch sind, könnte
- man natürlich eine der Passagen als Block markieren und vor der anderen mit
- der Suche danach beginnen. Sind die Passagen identisch, wird FEDIT die
- Passage als gefunden melden. Sind sie aber nicht identisch, wird man
- einfach nur ein 'nicht gefunden' ernten, ohne zu wissen, an welcher Stelle
- sich die beiden nun unterscheiden.
- Dafür also gibt es die Funktion 'Ungleichheit suchen'; sie vergleicht den
- Code ab der aktuellen Position mit dem Inhalt des markierten Blockes und
- stoppt am ersten Byte, das unterschiedlich ist.
-
- Also: Man will etwa den Inhalt zweier Files vergleichen. Dazu wird man das
- ganze erste File als Block markieren (Home, Undo, <shift>Home,
- <shift>Undo), sich an den Anfang des zweiten setzen und 'Ungleichheit
- suchen' im Menu wählen.
-
- Für diese Funktion ist es völlig unwesentlich, wo im Speicher sich der
- Block befindet, mit dem verglichen wird, und wo im Speicher die aktuelle
- Position liegt, an der der Vergleich beginnt. Man kann etwa Teile des ROMs
- mit Teilen eines Files vergleichen. Die Funktion steht im File- und im
- Memory- Modus gleichermaβen zur Verfügung.
-
-
- 4.8 Pfad setzen und Directory
-
- Mit der Menu- Funktion 'Zugriffspfad setzen' kann man den GEMDOS- Pfad
- verändern; Es wird einfach die GEMDOS- Funktion DSETPATH (CHDIR oder CD)
- aufgerufen. Alle Filenamen zum Laden oder Abspeichern beziehen sich auf
- diesen aktuellen Pfad, falls nicht der Filename selbst mit vorangestelltem
- Pfad angegeben wird. Es ist übrigens eine Eigenart von FEDIT, ein
- angesprochenes Laufwerk zum aktuellen Laufwerk zu erklären.
-
- Mit der Menu- Funktion 'Directory anzeigen' wird ein einfaches Verzeichnis
- der Namen von Files und Unterverzeichnissen im aktuellen Directory
- angezeigt.
-
-
- 5 Der Memory- Modus
-
- 5.1 Unterschiede zum File- Modus
-
- Im Memory- Modus wird der gesamte adressierbare Speicher des Rechners
- behandelt wie ein 'File' im File- Modus. Einige Filefunktionen sowie
- 'Suchen und Ersetzen' stehen nicht zur Verfügung, dafür Funktionen zur
- Speicherverwaltung und zum Nachladen von Programmen.
-
- Beim Editieren funktioniert <shift>Home nicht, da man in den seltensten
- Fällen an das Ende dieses 'Files' wollen wird, das bei $ffffff liegt.
-
- Innerhalb des adressierbaren Speicherbereiches liegen zwei Bereiche, die
- von FEDIT ausmaskiert werden: Der Bereich von $400000 bis $f9ffff, den die
- MMU nicht adressieren möchte (Bus- Error) und der Bereich von $ff0000 bis
- $ffffff, wo die Peripheriebausteine liegen, die man mit FEDIT sowieso nicht
- korrekt mit Daten beschicken könnte. Diese geschützten Bereiche werden
- angezeigt, als ob sie nur Null- Werte enthielten; Ansonsten kann man hier
- nichts schreiben und auch nichts suchen lassen. Dieser Schutz ist nur
- gedacht, um einwandfreies Arbeiten auch in den Regionen zu ermöglichen, die
- an geschützte Gebiete angrenzen (Da FEDIT dann immer auch ein Stück des
- geschützten Gebietes mit anzeigen wird) und erhebt keinen Anspruch auf
- Vollständigkeit (Wenn man etwa ein Langwort so auf das Ende eines
- ungeschützten Breiches schreibt, daβ ein Byte bereits auf einen geschützten
- Bereich fällt, wird man einen Bus- Error ernten; Lesen ist immer möglich).
- Der genannte Schutz existiert auch im Image- Modus, nicht aber bei der
- Unterschiedssuche; Zugriffe auf den Blockbereich werden ebenfalls nicht
- kontrolliert. (Teile der geschützten Bereiche als Block zu markieren und in
- geschützten Bereichen (die sowieso völlig leer aussehen) Unterschiede zu
- suchen, wird sich wohl vermeiden lassen)
-
- Die Bereiche, die von FEDIT ausmaskiert werden, sind als 'Systemvariablen'
- gegeben und somit bei Bedarf zu ändern; Siehe dazu das entsprechende
- Kapitel.
-
- Die Speicherbereiche, die weder RAM noch ROM enthalten, liefern entweder
- Daten, die bei jedem Lesen verschieden sind, oder $ff, aber keinen Fehler
- beim Lesen oder Schreiben. FEDIT schreibt ein gerade eingegebenes Zeichen
- auch auf den Bildschirm, nachdem es an den Speicher geschickt wurde; Was
- aber nicht heiβt, daβ der Speicher dieses Zeichen auch angenommen haben
- muβ.
-
- Zur Suchfunktion ist noch zu bemerken, daβ die Suche jeweils an der
- aktuellen Position beginnt und abgebrochen wird, wenn die Grenze zu einem
- maskierten Gebiet erreicht wird.
-
-
- 5.2 Die GEMDOS- Funktionen
-
- Im Memory- Modus stellt FEDIT einige GEMDOS- Funktionen zur Verfügung, die
- sich auf die Speicherverwaltung und das Nachladen von Programmen beziehen.
-
- - Mit 'Freier Speicher' bekommt man die Länge des gröβten freien GEMDOS-
- Speicherblocks zurück, wie er von der Funktion Malloc(-1) zurückgegeben
- wird.
-
- - 'Mfree(pos)' gibt den Speicherblock an GEMDOS zurück, der an der
- aktuellen Position beginnt.
-
- - 'Mshrink(pos)' versucht die Gröβe des Speicherblocks, der an der
- aktuellen Position beginnt, auf einen einzugebenden Wert zu ändern.
-
- - 'Programm laden und starten' führt mit der GEMDOS- Funktion Pexec, Modus
- 0, ein Programm aus. Der Name des Programmfiles muβ vollständig sein,
- Argumente können in der üblichen Weise hinter dem Programmnamen angegeben
- werden. Beispiel: FEDIT.PRG TEST.FIL 2000
-
- - 'Programm laden' führt in derselben Weise Pexec im Modus 3 aus, das
- heiβt, das Programm wird nur in den Speicher geladen, aber nicht gestartet.
- Nach dem Laden ist in üblicher GEMDOS- Manier der gesamte freie Speicher
- dem soeben geladenen Programm zugeteilt. FEDIT setzt die aktuelle Position
- auf die Basepage des geladenen Programms und geht in den Edit- Modus. Diese
- Basepage- Adresse ist zugleich die Adresse, die GEMDOS wieder benötigt, um
- das Programm zu starten, und die Adresse des GEMDOS- Speicherblocks, der zu
- dem Programm gehört. Man kann also mit Mfree direkt den Speicherblock
- wieder freigeben und damit das Laden 'ungeschehen' machen, oder mit Mshrink
- den vom Programm belegten Speicherblock zurechtstutzen.
-
- - 'Programm(pos) starten' führt Pexec im Modus 4 aus, wobei Pexec die
- aktuelle Position als Basepage- Adresse des zu startenden Programmes
- übergeben wird, so wie bereits von 'Programm laden' vorbereitet.
-
- Vielleicht sollte man hier erwähnen, daβ im Gegensatz zu Pexec Modus 0 bei
- Pexec Modus 4 der vom Programm verwendete Speicher nicht automatisch
- freigegeben wird, nachdem das Programm beendet ist. Man muβ also mit Mfree
- diesen Speicherbereich per Hand wieder freigeben. Einige Programme lassen
- sich fehlerfrei auch mehrmals hintereinander mit Pexec Modus 4 starten.
- (FEDIT selbst gehört sicherlich NICHT zu diesen Programmen !)
-
- Die Funktionen zum Laden von Programmen in FEDIT dienen hauptsächlich
- Testzwecken; Man kann damit Programme laden, in ihrer Ausführungs- Form
- untersuchen und sich nach Programmende die Änderungen im Speicher, also
- hauptsächlich die produzierten Daten, ansehen. FEDIT ist nicht als 'Shell'
- gedacht und erhebt keinen Anspruch, als solche besonders anwenderfreundlich
- zu sein.
-
-
- 6 Der Image- Modus (Speicher zeigen als Bild)
-
- Der 'Image- Modus' zeigt das File bzw. den Speicher ab der aktuellen
- Position als Bild; Das heiβt, daβ ab der aktuellen Position die Bytes in
- der aktuellen Zeilenbreite in das Bildschirm- RAM kopiert werden.
-
- Voreingestellt ist, daβ die Darstellung in der Auflösung und mit der
- Palette erfolgt, mit denen FEDIT aufgerufen wurde, und mit der Zeilen-
- breite, die der aktuellen Bildschirmbreite entspricht. Unkomprimierte
- Doodle-, Degas-, Stad- etc. Bilder lassen sich so direkt anzeigen, da sie
- genau Bildschirmbreite haben. Im Farbmodus läβt sich die Auflösung mit
- <shift>Help umschalten.
-
- Nicht in Panik geraten, wenn man einen weiβen Bildschirm vor sich hat und
- der Rechner auf keine Taste zu reagieren scheint: Wenn man im Filemodus ein
- File anschaut, das nur 100 Bytes lang ist, füllt das gerade mal die erste
- Bildschirmzeile, und wenn der Filepuffer dann noch leer ist, sieht man
- nichts und bemerkt auch nicht die Zeit, die nötig ist, um den Bildschirm
- aufzubauen. Mit HELP erlangt man Hilfe und Informationen über aktuelle
- Auflösung und Zeilenbreite, mit ESC kommt man zurück zum Menu.
- Mit Cursor up/down verändert man die aktuelle Position und damit den Anfang
- der Darstellung byteweise, mit <shift> up/down zeilenweise, mit <CTRL>
- up/down halbseitenweise. 'Halbseitenweise' ist exakt, d.h. mit zweimal
- <CTRL>down kommt man genau eine Bildschirmweite weiter, im Normalfall also
- zunächst genau 32000 Bytes. (Das kann dann interessant sein, wenn man einen
- Bildschirmbereich etwa als Block markieren will: Man markiert den
- Blockanfang, geht in den Image- Modus, zweimal <CTRL>down, verläβt den
- Image- Modus, geht ein Byte zurück (denn da ist das letzte Byte des
- Bereichs) und markiert das Blockende.)
-
- Zur Zeilen- oder Anzeigebreite ist zu sagen, daβ der Bildschirm eine
- Zeilenbreite in Bytes hat, die man den Line A- Variablen entnehmen kann;
- Die dargestellte Breite läβt sich im Image- Modus byteweise mit Cursor
- left/right, in Schritten von 8 Bytes mit <shift> left/right verändern oder
- mit Undo direkt als Zahlenwert eingeben.
- Wenn die Anzeigebreite kleiner ist als die verfügbare Bildschirmbreite,
- wird die neue Bildschirmzeile einfach früher begonnen; ist sie gröβer, wird
- die Ausgabe der Zeile mit Ende der Bildschirmzeile beendet. Man hat also im
- ersteren Fall nur ein entsprechendes Stück des linken Bildrandes mit dem
- angezeigten Bild belegt, im letzteren Fall fehlt der rechte Rand des
- Bildes.
-
- Die Desktop- Icons etwa lassen sich bei einer Anzeigebreite von 4 Bytes im
- ROM (6.02.86) bei $fd8286 und im tiefen RAM lokalisieren (Cursor setzen auf
- Adresse, im Menu Image- Modus wählen). Mit variabler Breite speichert GEM,
- auch irgendwo im tiefen RAM, den Ausschnitt des Bildschirms, der gerade von
- einem heruntergeklappten Pull- Down- Menu verdeckt wird (FEDIT resident
- machen, Menu herunterklappen und nachsehen).
-
- Der Image- Modus ist speziell auch gut geeignet, um sich einen Überblick
- über die Speicherbelegung zu verschaffen, und über die grobe Struktur in
- den Daten eines Programmes.
-
-
- 7 FEDIT resident; Aufruf und Einschränkungen
-
- 7.1 Allgemeines
-
- FEDIT ist resident installierbar. Zum einen behält FEDIT beim Resident-
- machen die bereits bei normalem Aufruf (während seiner Aktivität)
- bestehende Eigenschaft, sich nach einem RESET noch vor dem Booten (und dem
- Löschen des Speichers) für eventuelle Datenrettung etc. zur Verfügung zu
- stellen; Zum zweiten hängt sich FEDIT in die VBL- Queue ein, um sich durch
- eine Shifttastenkombination (Voreingestellt: CTRL-ALT-lSHIFT-rSHIFT)
- aktivieren zu lassen. Dafür reserviert sich FEDIT zunächst einen eigenen
- 32k- Bildschirmspeicher, dann wird das Programm beendet.
-
- FEDIT verwendet für die Abfragen beim VBL einige Systemvariablen, die in
- verschiedenen TOS- Versionen unterschiedlich sind; Erst beim Residentmachen
- werden diese Adressen entsprechend dem TOS- Datum aus der Tabelle
- entnommen. Wenn für die verwendete TOS- Version kein Eintrag auffindbar
- ist, wird das Residentmachen abgebrochen. Im Fall, daβ man 'Resident' im
- Memory- Menu gewählt hat, flackert die entsprechende Meldung nur kurz auf,
- danach wird der Bildschirm neu aufgebaut.
-
- Für Leute, die zuviel nachdenken, sei bemerkt, daβ FEDIT immer -ob nun als
- Programm aufgerufen, durch RESET oder Shifttasten aktiviert- über denselben
- Menupunkt beendet wird. FEDIT entscheidet selbst, ob damit 'Prozeβ
- beenden', 'Rücksprung zur Resident- Aufrufschleife' oder 'Rücksprung zur
- VBL- Routine, Interrupt wieder aktivieren' gemeint ist.
-
-
- 7.2 RESET- Residenz
-
- Nach einem RESET macht FEDIT keine Anstalten, seinen belegten Speicher-
- bereich von GEMDOS zurückzufordern; FEDIT ist also in diesem Moment nur
- ein Stück Code im freien Speicher, und auch eventuell vor dem RESET
- belegte Pufferbereiche sind für GEMDOS vogelfrei, obwohl sie von FEDIT
- noch genauso behandelt werden wie vorher. Man kann nach dem RESET neue
- Puffer schaffen (Wenn FEDIT aus dem Auto- Ordner gestartet wurde, muβ man
- das sogar, weil man sich im Aufrufschirm von FEDIT befindet); Diese
- neuen Puffer werden nun beim GEMDOS angefordert und normal belegt. Das
- Problem ist, daβ die neuen Puffer nun da liegen, wo nach Meinung von GEMDOS
- unbenutzter Speicher anfängt; Sie überschreiben also einen Teil des
- Speichers, beginnend im tiefen RAM, und auch den residenten Teil von FEDIT,
- wenn sie groβ genug sind (Einige 10kB Freiraum wird man haben, bis das
- geschieht). Es sei also der Hinweis erlaubt, daβ man nur möglichst
- geringe Puffergröβen neu belegen sollte. Um Daten zu retten, benutze
- man die Funktion 'Block abspeichern' und bearbeite man den Block wenn
- möglich vom hochgefahrenen Rechner aus, anstatt ihn zum jetzigen
- Zeitpunkt in einen Puffer zu transferieren. (Die Einschränkungen gelten
- sämtlich NICHT für Puffer, die bereits vor dem RESET existierten.)
-
- Puffer, die nach dem RESET geschaffen wurden, sollte man vor Verlassen von
- FEDIT wieder freigeben, da sie sonst weiterhin Speicher belegen. (Andere
- Puffer kann man nun nicht freigeben; Das merkt man, wenn man es versucht)
- Nach Verlassen von FEDIT bootet der Rechner (nach Ausführung evtl. anderer
- resetresidenter Programme), als ob nichts gewesen wäre. Wie gesagt, ist
- FEDIT danach verschwunden; es muβ neu geladen (oder mit gebootet) werden,
- um wieder zur Verfügung zu stehen. FEDIT ist also NICHT reset- RESISTENT.
-
-
- 7.3 'Unbedingter' Aufruf
-
- Nach betätigen der Shifttastenkombination steht FEDIT in der Form zur
- Verfügung, in der es verlassen wurde. Die alten Puffer kann man nicht
- freigeben, da der Prozeβ 'FEDIT' ja für GEMDOS beendet ist. Wohl kann man
- neue Puffer schaffen, sollte sie aber sicherheitshalber vor Beendigen von
- FEDIT wieder freigeben, da sie den unterbrochenen Prozeβ stören könnten (es
- ist zwar unwahrscheinlich, aber vielleicht rechnet das unterbrochene
- Programm nicht damit, daβ plötzlich Speicherbereiche belegt sind, die eben
- noch frei waren, ohne daβ das Programm selbst zwischenzeitlich irgendwelche
- Betriebssystemcalls gemacht hat).
- Schädlich könnte auch sein, wenn man dem unterbrochenen Programm das
- aktuelle Laufwerk und Directory verstellt. Wie bereits gesagt, wird das
- Laufwerk bereits gewechselt, wenn man ein anderes Laufwerk anspricht.
-
-
- 7.4 Bedingter Aufruf
-
- Mit dem Punkt 'Blockwatch on/off' im Memory- Menu kann man den 'Bedingten
- Aufruf' aktivieren. Die Bedingung dabei ist, daβ FEDIT nur noch dann
- aktiviert wird, wenn
- - die dafür vorgesehene Shifttastenkombination betätigt ist (voreingestellt
- ist lSHIFT rSHIFT)
- - der VBL- Interrupt stattfindet UND
- - sich der Program Counter beim Interrupt gerade im markierten Blockbereich
- befindet.
-
- Mit der Tastenkombination für den 'unbedingten' Aufruf kann man immer noch
- zu dessen Konditionen FEDIT aktivieren.
-
- Eigentlich ist diese Funktion beim Austesten von FEDIT entstanden, als
- FEDIT genau dann abstürzte, wenn der Interrupt zwischen zwei bestimmte
- Maschinenbefehle im BIOS traf; Um zu überprüfen, das dies nun keine
- Probleme mehr macht, hätte ich natürlich endlos Aufrüfe machen und jedesmal
- kontrollieren können, ob der Interrupt (ohne Absturz) nun an der heiklen
- Stelle kam (Siehe den Abschnitt über die 'Systemvariablen'); Stattdessen
- markierte ich die heikle Adresse und hielt die Tasten solange gedrückt, bis
- FEDIT selbst die Unterbrechung an dieser Stelle diagnostizierte. Und nicht
- abstürzte.
- Der Anwender kann die Funktion verwenden, um festzustellen, ob ein
- bestimmter Programmteil (wiederholt) aufgerufen wird, etwa Teile des
- Betriebssystems oder die Line F- Routinen im RAM; Oder um die
- Aufrufsicherheit von FEDIT zu erhöhen, wenn wider Erwarten die
- Unterbrechung von Programmen an bestimmten Stellen zum Absturz führen
- sollte (Dann: Einen Programmteil markieren, der oft aufgerufen wird und
- harmlos zu unterbrechen ist). Allerdings lagen die einzigen Schwierig-
- keiten, die bei mir aufgetreten sind, bei der Unterbrechung von Betriebs-
- systemroutinen; Und auch das sollte ja behoben sein.
-
-
- 7.5 Beschränkungen des Aufrufs
-
- Der Aufruf des residenten FEDIT über die Tastatur erfährt zwei Ein-
- schränkungen bezüglich des Zustands des Rechners zum Zeitpunkt des VBL-
- Interrupts:
- - Es werden keine GEMDOS- Funktionen unterbrochen
- - Die Systemvariable FLOCK ($43e.w) muβ Null sein (Kein Floppy- Zugriff).
-
- Wenn GEMDOS- Funktionen sozusagen im 'sample'- Modus aufgerufen werden,
- also ohne selbst die Kontrolle bis Eintritt eines bestimmten Ereignisses zu
- behalten, wird man kaum merken, daβ ein paar Interrupts für den Aufruf von
- FEDIT ausfallen, indem sie den Rechner gerade in einer GEMDOS- Routine
- erwischen. Gerade besonders einfache Programme ohne GEM aber (zum Beispiel
- Shells) tätigen ihre Eingabe oft über 'request'- Aufrüfe von GEMDOS wie
- Cconin. Ein solches Programm verbringt einen Groβteil seiner Zeit im
- GEMDOS, und kann speziell dann nicht unterbrochen werden, wenn es gerade
- auf Tastatureingabe wartet. Man kann auch aus einem solchen Programm heraus
- FEDIT aufrufen, wenn man die Tastenkombination gedrückt hält und
- gleichzeitig Buchstaben eintippt; Nach jedem Buchstaben wird das GEMDOS
- (zumindest kurz) verlassen.
- Beim Ausprobieren der Unterbrechungseinrichtung habe ich den Rechner auch
- schon mal beim Laden eines Programmes unterbrochen, also in einer sehr
- heiklen Lage (Diskettenzugriff, GEMDOS- Funktion). FEDIT lief, aber nach
- Rückkehr krachte es. Trotz der Beschränkungen, die nun bestehen, kommt man
- noch recht gut zum Zuge, etwa zwischen Programm- und Resourceladen. (Man
- halte einmal während des Ladens eines Programmes von Diskette die Aufruf-
- tasten gedrückt)
-
-
- 7.6 Anpassung an weitere TOS- Versionen
-
- Zur Anpassung von FEDIT an weitere TOS- Versionen kann man die
- Anpassungstabelle ändern, die am Ende des FEDIT- Programmes mit 'ADR>'
- markiert ist. (Also: FEDIT.PRG starten, FEDIT.PRG laden, freien Puffer
- erzeugen, dort 'ADR>' hineinschreiben, 'ADR>' als Block markieren, im
- vorigen Puffer suchen lassen.) Es folgen 5 Tabelleneinträge aus jeweils 5
- Langworten. Davon sind zunächst die ersten drei belegt; Vom Zeichen hinter
- '>' aus müβte man also 60 Zeichen weitergehen, um zum ersten unbelegten
- Eintrag zu gelangen (5 Langwort- Nullen). In die Langworte gehören
- geschrieben:
-
- - Das Datum des Betriebssystems in Hex: z.B. $02061986 für 6.2.1986. An
- dieses Datum kommt man, indem man in FEDIT im Memory- Modus auf Adresse $18
- setzt, <shift>F4 drückt, um den Merker 1 auf $18 zu setzen, FEDIT auf die
- Adresse $4f2 (_sysbase) setzt, <alt>F4 betätigt (Vorausgesetzt, es herrscht
- noch der default- Langwort- Modus) und den Wert ausliest, indem man im Hex-
- Anzeigemodus F3 drückt. (Das Datum im richtigen Format steht nämlich im
- Langwort ab Offset $18 im Header des Betriebssystems.)
-
- - Die Adresse der Speicherposition, in die das Betriebssystem den aktuellen
- Shiftstatus (als Bytewert) schreibt. Im TOS vom 6.02.86 lautet ein
- zuständiger Teil:
- FC29AA: move.b shiftstat(A5),D1
- cmp.b #$2a,D0
- bne zzz
- bset #1,d1
- zzz: ...
-
- - Die Adresse des Save- Bereichs des BIOS (Oberste Adresse eines Stack-
- Gebildes); Dies ist der normale Wert, den man vorfindet, wenn man sich mit
- FEDIT Speicherstelle $4a2.l anschaut (savptr). Aus Kontrollgründen dazu ein
- Auszug aus dem TOS vom 6.02.86, beginnend mit der Adresse des BIOS (Trap
- #13, zu finden in Speicherstelle $b4):
- FC074E: lea ...,A0
- move.l savptr,A1 ; (savptr).l=biossav
- move.w (sp)+,D0 ; Statusregister
- move.w D0,-(A1)
- move.l (sp)+,-(A1) ; Returnadresse
- movem.l D3-D7/A3-A7,-(A1) ; Also 11 Langwörter, 1 Wort gesichert
- move.l A1,savptr
- ...
-
- - Die Adresse der Adresse des Save- Bereichs des GEMDOS (gemdossav) und die
- oberste Adresse des GEMDOS- eigenen Stacks (gemdosstack). Dazu das TOS vom
- 6.02.86:
- FC4D48: btst #5,(sp) ; $fc4d48 ist die Adresse vom GEMDOS- Handler und
- bne.s ; steht als solche bei trap #1, in $84
- move.l usp,a0
- cmpi.w #$20,(a0)
- ...
- move.l A6,-(sp)
- movea.l gemdossav,a6
- movem.l D0/A3-A5,$68(A6)
- move.l (sp)+,$78(A6)
- ...
- move.l A5,$7c(A6) ; Also 6 Langworte insgesamt gesichert
- movea.l #gemdosstack,sp
- lea.l $32(A5),A0
- bra.s
- movem.l
- ...
- move.l sp,$7c(A6)
- lea.l $32(sp),a0
- movea.l #gemdosstack,sp
- ...
-
-
- 8 FEDIT- 'Systemvariablen'
-
- 8.1 Inhalt des entsprechenden Bereichs von FEDIT
-
- Ein Auszug aus dem initialisierten Datenbereich:
-
- .DC.b "ADR>" ; Damit man die Adressentabelle findet
- adr_table:
- ; Format: Tosdatum.l, shiftstat.l, biossav.l, gemdossav.l, gemdosstack.l
- .DC.l $2061986,$e1b,$93a,$602c,$166e ; erstes ROMTOS
- .DC.l $4221987,$e61,$93a,$87ce,$16ce ; Blitter- ROMTOS
- .DC.l $5181988,$e63,$93a,$5528,$2a3c ; neues RAMTOS
- .DC.l 0,0,0,0,0
- .DC.l 0,0,0,0,0
- .DC.l 0 ; Die Ende- Marke
-
- .DC.b "MSK>" ; Damit man die maskierten Speicherbereiche findet
- maskber1s: .DC.l $400000 ; Start erster maskierter Bereich
- maskber1e: .DC.l $f9ffff ; Ende (einschlieβlich)
- maskber2s: .DC.l $ff0000 ; Start zweiter
- maskber2e: .DC.l $ffffff ; Ende
-
- fedpalette:
- .DC.w $777,$700,$70,$0,$111,$222,$333,$444
- .DC.w $555,$7,$1,$10,$100,$200,$20,$2
-
- .DC.b "PAL>" ; Damit man die 34 DEGAS- Headerbytes findet
- storerez: .DS.w 1 ; Auflösung sichern
- storepalette:
- .DCB.w 16,0
-
- .DC.b "ORSCR>" ; Damit man den Bildschirm findet
- orgscreen: .DC.l 0 ; Speicher für Bildschirmadr bei VBL- Aufruf
- fedscreen: .DC.l 0 ; Eigener Bildschirm
-
- .DC.b "SFTMD>" ; Damit man das Modus- Byte findet
- action_shift: .DC.b %1111 ; ALT CTRL LSHIFT RSHIFT zum Aktivieren
- bwatch_shift: .DC.b %11 ; LSHIFT RSHIFT zum Aufruf aus Blockbereich
- bwatch_flag: .DC.b 0 ; Flag für Aufruf nur für PC im Blockbereich
- store_conterm: .DC.b 0
- st_crsrmode: .DC.b 0,0 ; Flag f. Cursorstatus on/off
-
- zbasis: .DC.w 10 ; Zahlenbasis für Ausgaben
-
- .DC.b "ORSTK>" ; Damit man den Aufrufstack findet
- sav_ssp: .DC.l 0
- fedstack: .DC.l 0
- .DC.b "IADDR>" ; Damit man die Interruptadresse findet
- interrupt_at: .DC.l 0
-
- inpbuffer: .DC.b 80,0
- inpbeg: .DCB.b 82,0 ; Zum Addieren des Command tail counters
-
-
- 8.2 Und Erläuterungen dazu
-
- - Adressentabelle zum Anpassen des Interrupt- Teils. Marke: 'ADR>'
- 5*5 Langworte, siehe 'FEDIT resident'
- 0.l als Tabellenabschluβ
-
- - Die Begrenzungen der ausmaskierten Speicherbereiche. Marke: 'MSK>'
- 2*2 Langworte, jeweils Start/Endadresse des Bereichs (inklusive)
-
- - Die von FEDIT verwendete Farbpalette
- 16 Worte
-
- - Der DEGAS- kompatible Farbzustand bei Aufruf von FEDIT. Marke: 'PAL>'
- 1 Wort Auflösung (0-2=PI1-PI3); 16 Worte Palette
- Zum Beispiel kann man das Bild, das bei der Unterbrechung angezeigt wurde,
- im DEGAS- Format abspeichern, indem man diese 17 Worte als Block markiert
- und als ebensolchen abspeichert; Sodann mit 'ORSCR>' auf das erste Byte des
- Originalschirms positioniert, Blockanfang markiert, 31999 Bytes weitergeht
- (im Image- Modus zwei Halbseiten vor und ein Byte zurück), Blockende
- markiert und diesen Block an den DEGAS- Header anhängt, indem man ihn unter
- demselben Namen abzuspeichern versucht und die Frage richtig beantwortet.
- Allerdings gibt es zu diesem Zweck eigene Programme (SNAPSHOT).
-
- - Die Bildschirmadressen bei der Unterbrechung und von FEDIT; 'ORSCR>'
- 2*1 Langworte
- Man kann etwa auf den Anfang des Original- VideoRAMs positionieren, indem
- man hinter 'ORSCR>' <alt>F4 drückt, vorausgesetzt, man ist im Long pos.
- Modus und im Merker F4 steht die unberührte Adresse 0. Man versuche nun
- einmal den Image- Modus !
-
- - Bitmuster für die Aufruf- Tastenkombinationen und diverse; 'SFTMD>'
- Hinter 'SFTMD>' wird der Cursor durch Drücken von <ctrl>UNDO gesetzt.
- 2*1 Byte Shifttastenzustände für Aktivierung des residenten FEDIT im
- Format, wie es von der BIOS- Funktion 11 (Kbshift) geliefert wird
- (Bit 6=lMaus, rMaus, CAPS, ALT, CTRL, lSHIFT, rSHIFT=Bit 0)
- Erstes Byte Kombination für normalen Aufruf; zweites Byte Blockwatch-
- Aufruf
- 1 Byte Blockwatch- Flag; 1 Byte Kopie der Systemvariable Conterm ($484.b)
- beim Aufruf von FEDIT; 2 Bytes;
- 1 Wort Zahlenbasis für die Zahlenausgabe (wird von FEDIT zwischen 10 und 16
- geschaltet; Wer gern Zahlen zur Basis 25 o. dgl. sieht, mag hier seine
- Lieblingszahl eintragen. Beim nächsten Umschalten der Basis mit FEDIT steht
- hier wieder 10 oder 16. Es sollte übrigens nicht wundern, daβ man beim
- Ansehen dieser Variablen mit F2 immer die Ausgabe '10' erhalten wird).
-
- - Stackpointer bei Aufruf von FEDIT und FEDIT- Stacktop. Marke: 'ORSTK>'
- 2*1 Langwort SP beim Aufruf von FEDIT durch die VBL- Routine und
- anfänglicher SP des FEDIT- eigenen Stacks.
- Auf dem Originalstack findet man vor:
- 0.l: Returnadresse zur VBL- Routine
- 4.l: D7/A0 gesicherte Register der VBL- Routine
- 12.l: D0-D7/A0-A6 Register des unterbrochenen Programmes
- 72.w: sr Statusregister des unterbrochenen Programmes
- 74.l: Returnadresse vom VBL- Interrupt=Adresse der Unterbrechung
-
- - Adresse der Unterbrechung des Programmes. Marke: 'IADDR>'
- 1 Langwort
- Hier entledigt FEDIT den Benutzer von der Mühe, sich diese Adresse auf dem
- Stack anzusehen (Dabei wäre das ganz einfach: Marker F4 auf 74 setzen,
- hinter 'ORSTK>' <alt>F4 drücken, und man ist am Ziel seiner Träume)
-
- - Platz zur Aufnahme von Zeileneingaben.
-
-
- 9 Beispiele für den Umgang mit FEDIT
-
- Was man mit FEDIT zum Beispiel machen kann:
-
- - Files patchen.
- (Für nicht- Anglikaner (oder wie hieβ das Wort doch gleich ?): <patchen>
- steht für das gezielte Verändern von Files, vor allem Programmen, an einer
- oder an wenigen Stellen)
- Zum Beispiel haben unverständlicherweise einige Programme feste
- Laufwerkskennungen, auf denen sie bestimmte Dateien suchen. Das ist
- ärgerlich bei Verwendung einer Platte oder Ramdisk (denn meistens lautet
- die feste Kennung 'A:'). Mit FEDIT kann man diese Kennung umbenennen oder
- ganz entfernen (in letzterem Fall wird dann auf dem aktuellen Laufwerk
- gesucht, was zumeist auch die beste Wahl ist). Zeichenketten enden meistens
- mit einem Nullbyte, so daβ es kein Problem darstellt, sie zu verkürzen.
- (Dazu noch der Hinweis, daβ <verkürzen> natürlich nicht meint, daβ hier die
- Delete- Taste zum Einsatz kommen sollte: Wenn man nicht genau weiβ, was man
- da tut, sollte man die Länge eines Programmfiles auf jeden Fall
- unverändert lassen ! Das Mittel heiβt also: Entweder den Pfadnamen ganz
- von Hand über das Vorhandene schreiben oder als Block hochkopieren.)
-
- - Sich die möglichen Ausgaben eines Programmes anschauen.
- Meistens verwenden Programme keinen Sprachgenerator, der die notwendigen
- Meldungen zur Zeit ihrer Ausgabe formulieren würde, sondern die menschlich
- anmutenden Sätze, mit denen der Rechner den Laien verwirrt, stehen
- betrügerischerweise bereits säuberlich zumeist am Ende der Programmdatei.
- (Beispiel: FEDIT besteht fast zur Hälfte aus Text.) Oft erfährt der geübte
- Beobachter aus dem Anschauen eines Programmes mehr über die Möglichkeiten
- und Grenzen desselben als aus dem Handbuch (was zweifellos an den
- Handbüchern liegt).
-
- - Sich einen Einblick in Datenstrukturen im weitesten Sinne verschaffen.
- Wenn man Programme schreibt, die bestimmte Datenformate erzeugen oder
- verarbeiten sollen, kann man sich mit FEDIT ansehen, wie das Zielformat
- aussieht und ob die bisherige Ausgabe eigener Programme sich an die
- gegebenen Regeln hält.
-
- - Ich habe FEDIT bereits dazu verwendet, Texte zu bearbeiten, die entweder
- durch eine Fülle formatierender Leerzeichen auf für andere Programme
- unverarbeitbare Gröβe aufgebläht waren (->Ersetzen doppelter Leerzeichen
- durch einfache) oder die für bestimmte Texteditoren unleserlich waren (das
- gibt's, daβ Texteditoren einfach njet zu einem Text sagen, ohne etwa den
- Versuch zu machen, zu lange Zeilen abzuknicken oder Zeichen, die nicht
- vorkommen dürfen, zu überlesen). In beiden Fällen kann man mit FEDIT und
- ein bischen Überblick wieder lesbare Zustände einkehren lassen.
-
- - Beim Erstellen dieser Dokumentation geschah es, daβ ein Sektor des
- Dokumentationsfiles unlesbar wurde; Das Programm, mit dem ich sie
- erstellte, war auch nach Ersetzen der entstandenen Leerbereichs durch
- unverfängliche Schriftzeichen (mit FEDIT) nicht dazu zu bewegen, das
- Dokument wieder an Sohnes Statt anzunehmen, da es im gelöschten Bereich
- wohl ganz bestimmte Formatzeichen erwartete; Das ist besonders ärgerlich,
- da ja nur ein sehr geringer Teil des Dokuments tatsächlich gelöscht war.
- Mit FEDIT habe ich nun die Partien, die ich seit dem letzten Backup neu
- geschrieben hatte, extrahiert und daraus durch ersetzen der Steuerzeichen
- ASCII- Texte gemacht, die sich vom Programm anstandslos in das Backup
- einladen lieβen.
-
-
- 10 Abschied
-
- So long,
- yours,
-
- Bernd
-